Business Plan

Business Plan

E

The idea here is to create a simple business plan for my new personal financial planning firm.

Revision History

  • 18 January, Document started

Description of Firm

Services Provided

  • Personal financial planning

Market Analysis

In [ ]:
 

Founding the Firm Part 1

Scope and Goal

My project for 2021 is to start my own financial planning firm. Specifically, the goals for this project will be to:

  • [ ] Engage 1 paying client by December 31, 2021.

Milestones

  1. Business plan
  2. Create a legal entity for the business
  3. Get all the required licenses necessary to begin operations
  4. Complete professional development courses
  5. Develop statements of work, templates, charts, any other materials required for customers
  6. Marketing Plan
  7. Rollout!

Timeline

Milestone Activity Dep.'s Start Stop Duration (business days)
Business Plan 1.1 Create list of services 1/1/2021 1/1/2021 1
1.2 Write company description 1/4/2021 1/4/2021 1
1.3 Write market analysis 1.2 1/5/2021 1/8/2021 4
1.4 Write competitive analysis 1/11/2021 1/15/2021 5
1.5 Write marketing plan 1.3, 1.4 1/18/2021 1/20/2021 3
1.6 Write executive summary 1.2-1.5 1/21/2021 1/21/2021 1
1.7 Final proofread and publish to blog 1/22/2021 1/22/2021 1
Legal entity 2.1 Decide on a business structure 1.7 1/25/2021 1/25/2021 1
2.2 Come up with an official name 1/26/2021 1/26/2021 1
2.3 Register with state 2.2 1/27/2021 1/27/2021 1
2.4 Set up a bank account 2.3 1/28/2021 1/28/2021 1
2.5 Business phone #? 2.4 1/29/2021 1/29/2021 1
Licensing & Legal Reqs 3.1 Register and Study for Series 65 2/1/2021 2/26/2021 20
3.2 Take Series 65 3.1 3/1/2021 3/2/2021 1
3.3 Register RIA with state 3.2 3/3/2021 3/4/2021 2
3.4 Errors and Omissions Insurance 3/5/2021 3/5/2021 1
Professional Development 4.1 Review and Personalize Curriculum 3/8/2021 3/8/2021 1
4.2 'Survey of Personal Financial Planning' 4.1 3/9/2021 4/9/2021 24
4.3 'Income Taxes and Personal Financial Planning' 4.1 4/12/2021 5/14/2021 25
4.4 'Investments in Personal Financial Planning' 4.1 5/17/2021 6/18/2021 25
4.5 'Insurance in Personal Financial Planning' 4.1 6/21/2021 7/23/2021 24
4.6 'Estate Planning' 4.1 7/26/2021 8/27/2021 25
4.7 'Employment Benefits and Retirement Planning' 4.1 8/31/2021 10/1/2021 25
4.8 'Personal Financial Planning Capstone' 4.2-4.7 10/4/2021 11/5/2021 25
Develop Materials 5.1 Develop Standard Reports 4.8 11/8/2021 11/12/2021 5
5.2 Develop Statement of Work 5.1 11/15/2021 11/19/2021 5
5.3 Develop Standard Presentation 5.1 11/22/2021 11/26/2021 5
Marketing Plan 6.1 Ads
Close the Sale 7.1 Make a sale

How I Built This Blog (Part 1)

Introduction

In the last post, we defined our technical requirements and (after some exploration) settled on Nikola as the platform for the blog. In this installment, we'll create an environment, install Nikola, get everything set up, build our first post, and then push the whole thing to GitHub pages.

Step 1 -- Creating the Repository

I'm assuming that you already have a good version of python 3 and git installed and that you already have an account on github

  1. Log in to github and create a new repository named <yourUsername>.github.io where <yourUsername> is your username.
    • Choose a .gitignore for python, and a license if you want.
  2. Now you'll need to clone this new repository to the local machine where you'll be working.
    • On a mac, I did this with git clone git@github.com:shanewilkins/shanewilkins.github.io.git from the directory above where I wanted the new project folder shanewilkins.io.git to live.

Step 2 -- Creating a Python Environment

  1. Navigate to the new project folder cd <yourUsername>.github.io
  2. Create a virtual environment for our project with virtualenv venv which should create a new subfolder called venv in the project folder.
  3. Activate the virtual environment with source venv/bin/activate. You should see (venv) to the left of your command prompt.
    • You can do python --version or which python to make sure that the active version of python is the right version from the virtual environment.
  4. Update the installed versions of the "seed" packages python -m pip install -U pip setuptools wheel

Step 3 -- Installing Nikola and Initializing a Site

  1. Now we install Nikola with pip install "nikola[extras]". This will take a couple of minutes. Since Nikola supports Jupyter out of the box, Nikola has to depend on all of Jupyter's numerous dependencies too.
  2. Once we have Nikola installed, we are ready to start the blog! All we have to do is nikola init and Nikola will start an interactive prompt to guide us through some setup questions. (Don't worry about choosing the wrong thing--you can change all of these settings later in conf.py.)
  3. Open conf.py and make sure of three things:

    • SITE_URL = "https://<yourUsername>.github.io",
    • GITHUB_DEPLOY_BRANCH = 'main' (not master), and
    • POSTS can find .ipynb with
POSTS = (
    ...
    ("posts/*.ipynb", "posts", "post.tmpl")
)

Step 4 -- Writing the First Post

  1. Now to create your first post (which will be a Jupyter notebook) do nikola new_post -f ipynb and tell the prompt what you'd like the name of this post to be. (Note. all the new_post command is really doing is populating notebook metadata, which you can edit later from inside Jupyter with Edit>Edit Notebook Metadata
  2. Now fire up the notebook with jupyter notebook, and you should find your new post in the posts directory.
  3. Write your post! :)
  4. Save the post and close Jupyter.

Step 5 -- Publish to Github Pages

  1. From the commandline in your main project folder now you can simply do nikola github_deploy and Nikola will automagically build the site, commit changes, and push to the remote repository.
  2. Go get a cup of coffee.
  3. Now navigate in your browser of choice to https://<yourUsername>.github.io and, if all has gone well, you should see your brand new blog appear, courtesy of github pages.

How I Built This Blog (Part 0)

Hello World!

I will use this blog to post some of my personal data science projects and to work out some of my ideas. The primary goal is to keep myself writing code and building a portfolio of data science projects, but hopefully others will find something useful to read here as well.

As my first series of posts, I'm going to write about the project of creating the blog itself.

Let's begin by defining our requirements and then we can look to see what technologies we might adopt to fulfill these requirements.

  • The first and most important requirement is that we want a python-based blogging platform easy to use. We want to spend our time writing content, not twiddling with configuration files or so on. Some additional features that would be nice to have in our blogging platform would be
    • the ability for readers to leave comments or subscribe to future posts,
    • use custom themes for styling the appearance, and
    • ability to support LaTeX-style mathematics, preferably with KaTeX
  • Second, we want to be able to keep all of our source code and other content in version control to ensure we have good offsite backups and to give us flexibility to move to a different platform in the future if our requirements change. I use git for my version control, so I'd like to be able to publish content to the site via git.
  • Third, we'd really like to be able to write our content in Markdown files and post Jupyter Notebooks so that we can share code and visualizations as well as written text.
  • Fourth, we'd like to have our own domain name.
  • Fifth, we'd like to do all this as cheaply as possible ...

Choosing a Blogging Platform

Since Python is the language I'm the most comfortable in, I want a blogging platform that is based on python in case I ever need to try customizing something. My first thought when looking for a blogging platform was to build out a blog using Django following one of the numerous tutorials for building a blog with Django, since I'm very interested in building out a Django site in the future. Django would offer the ability to offer a dynamic site with a live database and build dashboards or other interactive visualizations that could be dynamically updated over time. On the other hand, the benefits of a dynamic site are purchased with considerably increased complexity. Since I am much more interested in writing a blog than I am in writing blogging software and the benefits of a dynamic site do not appear immediately useful, I settled on the idea of doing something much simpler, which meant using a static site.

Having decided on using a static site, the choice of python static blog generator platforms gets basically comes down to Pelican vs Nikola (no, not that Nikola). Both platforms support rich sets of features including plugins, themes, and extensions. Both options have all the features we identified earlier in our requirements:

Feature Nikola Pelican
Easy static sites? Y Y
Comments? Y Y
Custom themes? Y Y
LaTeX support? Y Y
Markdown? Y Y
Jupyter notebooks? Y Y
Publish with git? Y Y

In point of fact, I've only discovered two small differences between the two packages.

First, Nikola offers a neat incremental build system that only rebuilds existing content if the source for that post has changed, whereas Pelican appears to rebuild every post every time. In theory the incremental builds could be a real time-saver if one had a large number of posts.

The second, and potentially more significant difference between the two platforms comes in the user base. As of the time of this writing, Pelican has 10k stars on github and Nikola has only 2k. To be sure, both projects have established user bases and have ongoing development and support, but I have a strong preference for the larger user base. A larger user base means more people out there writing plugins, documentation, and answering stack overflow questions, and that's what I want.

Update 12/20/2020

Although, I initially chose Pelican because of it's larger userbase, I ended up changing my mind because although Pelican does have plugins that support notebooks, Pelican itself does not do so out of the box. Both plugins I tried (pelican-jupyter and ipython) do not appear to be actively maintained. So, I ended up very quickly trapped in the realm of hunting through documentation and trying to resolve version conflicts. That was the opposite of what I was looking for, so I changed my mind.

So far, I'm very pleased with Nikola. The build time is noticably faster and the built in support for Jupyter notebooks is really good.

Test Post!

Test Post

Basic Markdown Functions

Text

italics

bold

~strikethrough~

links

blockquotes

Lists:

Ordered
  1. One
  2. Two
Unordered
  • Cat
  • Bat
Checkboxes
  • [x] Checkboxes
  • [ ] Theorem environments

(For some reason, as of the time of writing the checkboxes also have bullets beside them, which is not desired.)

Unicode text

μῆνιν ἄειδε θεὰ Πηληϊάδεω Ἀχιλῆος

οὐλομένην, ἣ μυρί᾽ Ἀχαιοῖς ἄλγε᾽ ἔθηκε,

πολλὰς δ᾽ ἰφθίμους ψυχὰς Ἄϊδι προΐαψεν

ἡρώων, αὐτοὺς δὲ ἑλώρια τεῦχε κύνεσσιν

5οἰωνοῖσί τε πᾶσι, Διὸς δ᾽ ἐτελείετο βουλή,

ἐξ οὗ δὴ τὰ πρῶτα διαστήτην ἐρίσαντε

Ἀτρεΐδης τε ἄναξ ἀνδρῶν καὶ δῖος Ἀχιλλεύς.

Images from the web

Mathematics

The flavor of Markdown I'm using supports $\LaTeX$ typesetting of mathematics via MathJax.

For instance, here are Maxwell's equations:

\begin{align} \nabla \times \vec{\mathbf{B}} -\, \frac1c\, \frac{\partial\vec{\mathbf{E}}}{\partial t} & = \frac{4\pi}{c}\vec{\mathbf{j}} \\ \nabla \cdot \vec{\mathbf{E}} & = 4 \pi \rho \\ \nabla \times \vec{\mathbf{E}}\, +\, \frac1c\, \frac{\partial\vec{\mathbf{B}}}{\partial t} & = \vec{\mathbf{0}} \\ \nabla \cdot \vec{\mathbf{B}} & = 0 \end{align}

It doesn't seem to support theorem environments, alas.

Python code

In [1]:
# a comment

import pandas as pd
import numpy as np
import plotly.express as px
import plotly.graph_objects as go 
from urllib.request import urlopen
import json

Data frames

In [2]:
df = px.data.iris()
df
Out[2]:
sepal_length sepal_width petal_length petal_width species species_id
0 5.1 3.5 1.4 0.2 setosa 1
1 4.9 3.0 1.4 0.2 setosa 1
2 4.7 3.2 1.3 0.2 setosa 1
3 4.6 3.1 1.5 0.2 setosa 1
4 5.0 3.6 1.4 0.2 setosa 1
... ... ... ... ... ... ...
145 6.7 3.0 5.2 2.3 virginica 3
146 6.3 2.5 5.0 1.9 virginica 3
147 6.5 3.0 5.2 2.0 virginica 3
148 6.2 3.4 5.4 2.3 virginica 3
149 5.9 3.0 5.1 1.8 virginica 3

150 rows × 6 columns

Charts and Graphs

Line Charts

I'm using Plot.ly for my graphing, because it offers an intuitive, easy-to-use API and because it supports interactive visualizations.

In [3]:
# example graph using the Iris dataset
df = px.data.iris()
fig = px.scatter(df, x="sepal_width", y="sepal_length", color="species", marginal_y="violin",
           marginal_x="box", trendline="ols", template="simple_white")
fig.show()

Scatterplots

In [4]:
# the same dataset in 3d

fig = px.scatter_3d(df, x='sepal_length', y='sepal_width', z='petal_width',
              color='species')
fig.show()

Area charts

Another example visualizing topographical data with a color scheme.

In [6]:
# 3D surface example plot from the plotly docs
# Read data from a csv
z_data = pd.read_csv('https://raw.githubusercontent.com/plotly/datasets/master/api_docs/mt_bruno_elevation.csv')

fig = go.Figure(data=[go.Surface(z=z_data.values)])

fig.update_layout(title='Mt Bruno Elevation', autosize=False,
                  width=500, height=500,
                  margin=dict(l=65, r=50, b=65, t=90))

fig.show()

Geodata visualizations

Another cool chloropleth example from the docs that utilizes GeoJSON to visualize the unemployment rate in the US by county.

In [7]:
with urlopen('https://raw.githubusercontent.com/plotly/datasets/master/geojson-counties-fips.json') as response:
    counties = json.load(response)


df = pd.read_csv("https://raw.githubusercontent.com/plotly/datasets/master/fips-unemp-16.csv",
                   dtype={"fips": str})

fig = px.choropleth_mapbox(df, geojson=counties, locations='fips', color='unemp',
                           color_continuous_scale="Viridis",
                           range_color=(0, 12),
                           mapbox_style="carto-positron",
                           zoom=3, center = {"lat": 37.0902, "lon": -95.7129},
                           opacity=0.5,
                           labels={'unemp':'unemployment rate'}
                          )
fig.update_layout(margin={"r":0,"t":0,"l":0,"b":0})
fig.show()